package edu.qd.learn.newchapter.chapter05.stream;

import edu.qd.learn.newchapter.chapter01.Operation;
import edu.qd.learn.newchapter.chapter03.reflect.demo01.entity.Dog;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 学习一下stream类里面相关的操作
 *
 * @author 布衣
 */
public class LearnStream {

    // List<Dog>
    //将原有集合产生一个副本 o(n),不操作原对象
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("李四");
        list.add("张三");
        list.add("王二五");

        System.out.println(list.getClass().getName() + "@" + Integer.toHexString(list.hashCode()));
        System.out.println(list.stream());


//        stream : 开始
        //数组操作不能直接转换成stream ,数组帮助类
//        int[] as;
//        Arrays.stream(as)
        //集合操作
        //Map<String,String> map = new HashMap<>();
        //map不能直接转换成stream
        // Collection 和其所有的子接口都可以使用 collection.stream();
//        Collection<String> collection = new ArrayList<>();
//                 中间  表示方法返回值 还是stream流本身
        //filter(predicate) 表示过滤 ，去掉我不想要的,保留断言型为真的
        //stream.filter(x-> x.contains("宇")).forEach(System.out::println);

        //map(function)
        //mapToLong
        //mapToInt
        //mapToDouble
        Stream<String> stream = list.stream();
//        System.out.println(stream.mapToLong(x -> x.length() == 2 ? 2 : 3).mapToDouble(x -> x).mapToInt(x -> (int)x).sum());

        //jdk1.8全新类
        stream.peek(x -> System.out.println(x));

        List<String> collect = Stream.of("ze", "one", "two", "three", "four")
                .filter(e -> e.length() >= 3)
                .peek(e -> System.out.println("Filtered value: " + e))
                .map(String::toUpperCase)
                .peek(e -> System.out.println("Mapped value: " + e))
                .collect(Collectors.toList());

        System.out.println(collect + "==>");
        Collections.rotate(list, 2);
        System.out.println("---->" + list);





//        Optional<String> o= stream.findAny().filter(x -> x.contains("张"));
//
//        System.out.println(o.orElse("sss"));
//        String s = o.orElse("无人");
//
//        if(o.isPresent()){
//            String s1 = o.orElseGet(()->{
//                return "sfdsfsdf";
//            });
//            System.out.println(s1);
//        }


//                 结束
//        forEach  循环（消费型）
//        .sum()   求和(int long double)
        System.out.println(abc().orElse("为空").equals("张三"));
    }

    /**
     * Optional 解决方法返回值 有可以有为null的情况，导致其它人在调用时，出现空指针问题.
     *
     * @return
     */
    public static Optional<String> abc() {
        return Optional.of("张三");
    }

    // 有一个集合里面存储了大量的商品信息，其中包含商品名称、商品价格、商品数量等属性，请编写程序完成如下需求：
    //1  列出商品价格在2.5-3.5期间的"方便面"

    //2 库存当量大于 50的商品名称，转换成一个全新的list<String>

    //3 将所有商品价格在2.5 - 3.5 区间，全部改成5.5元，改集合

}
